package com.itlong.cloud.sdk.service;

import com.itlong.cloud.POJO.DTO.sdk.*;
import com.itlong.cloud.POJO.PO.BuildInfoPO;
import com.itlong.cloud.POJO.PO.ProjectPO;
import com.itlong.cloud.POJO.PO.RoomInfoPO;
import com.itlong.cloud.POJO.PO.UnitInfoPO;
import com.itlong.cloud.POJO.VO.sdk.CloudTalkSDKServerGetBuildVO;
import com.itlong.cloud.POJO.VO.sdk.CloudTalkSDKServerGetUnitVO;
import com.itlong.cloud.POJO.VO.sdk.SDKServerProjectInfoListPageVO;
import com.itlong.cloud.utils.page.Page;

import java.util.List;
import java.util.Map;

/**
 * <desc>
 *      云对讲SDK项目服务层接口
 * </desc>
 *
 * @createDate 2018/05/17
 */
public interface ICloudTalkSDKServerProjectService {

    /**
     * <desc>
     *      根据参数字段查询build_info信息
     * <desc/>
     *
     * @param param 查询参数集
     * @return List<BuildInfoPO> 返回对象集
     * @author wangzhi
     * @createDate 2018/05/17
     */
    List<BuildInfoPO> getBuildByParam(Map<String, Object> param);

    /**
     * <desc>
     *      更新项目楼栋信息
     * </desc>
     *
     * @param buildUpdates 待更新的PO对象集
     * @return 更新的数量
     * @author wangzhi
     * @createDate 2018/05/17
     */
    Integer updateBuild(List<BuildInfoPO> buildUpdates);

    /**
     * <desc>
     *      保存项目楼栋信息
     * </desc>
     *
     * @param buildSaves 待保存的PO对象集
     * @return 保存的数量
     * @author wangzhi
     * @createDate 2018/05/17
     */
    Integer saveBuild(List<BuildInfoPO> buildSaves);

    /**
     * <desc>
     *      根据参数字段查询unit_info信息
     * <desc/>
     *
     * @param param 查询参数集
     * @return List<UnitInfoPO> 返回对象集
     * @author wangzhi
     * @createDate 2018/05/17
     */
    List<UnitInfoPO> getUnitByParam(Map<String, Object> param);

    /**
     * <desc>
     *      更新项目单元信息
     * </desc>
     *
     * @param unitUpdates 待更新的PO对象集
     * @return 更新的数量
     * @author wangzhi
     * @createDate 2018/05/17
     */
    Integer updateUnit(List<UnitInfoPO> unitUpdates);

    /**
     * <desc>
     *      保存项目单元信息
     * </desc>
     *
     * @param unitSaves 待更新的PO对象集
     * @return 更新的数量
     * @author wangzhi
     * @createDate 2018/05/17
     */
    Integer saveUnit(List<UnitInfoPO> unitSaves);

    /**
     * <desc>
     *      云对讲SDK批量添加用户房间信息
     * <desc/>
     * @param saveAppUserDTOs     用户房间信息
     * @return
     * @author JuGuang.S
     * @createDate 2018/05/17
     */
    Map<String,Object> addUserRoomInfo(List<SDKSaveAppUserDTO> saveAppUserDTOs);

    /**
     * <desc>
     *      根据参数字段查询room_info信息
     * </desc>
     *
     * @param param 查询参数集
     * @return List<RoomInfoPO>返回对象集
     * @author wangzhi
     * @createDate 2018/05/18
     */
    List<RoomInfoPO> getRoomByParam(Map<String, Object> param);

    /**
     * <desc>
     *      更新项目房间信息
     * </desc>
     *
     * @param roomUpdates 待更新的PO对象集
     * @return 更新的数量
     * @author wangzhi
     * @createDate 2018/05/18
     */
    Integer updateRoom(List<RoomInfoPO> roomUpdates);

    /**
     * <desc>
     *      保存项目房间信息
     * </desc>
     *
     * @param roomSaves 待保存的PO对象集
     * @return 更新的数量
     * @author wangzhi
     * @createDate 2018/05/18
     */
    Integer saveRoom(List<RoomInfoPO> roomSaves);

    /**
     * <desc>
     *      云对讲SDK查看该项目下是否存在指定用户
     * <desc/>
     * @param projectId     项目编号
     * @param userId     用户Id
     * @return
     * @author JuGuang.S
     * @createDate 2018/05/21
     */
    Integer userIsExist(String projectId,String userId);

    /**
     * <desc>
     *      云对讲SDK修改项目下指定用户的禁用启用状态
     * <desc/>
     * @param param 项目编号、用户ID、所要改变的状态
     * @return
     * @author JuGuang.S
     * @createDate 2018/05/21
     */
    void modifyUserStatus(Map<String, Object> param);

    /**
     * <desc>
     *      根据projectId,buildNum,unitNum和roomNum查询房间信息
     * <desc/>
     * @param       params      待查询的参数集
     * @return      符合的房间对象集
     * @author JuGuang.S
     * @createDate 2018/05/21
     */
    List<RoomInfoPO> getRoomByPiBnUnRn(Map<String, Object> params);

    /**
     * <desc>
     *      根据projectId,buildNum,unitNum和roomNum查询该房间下是否已有业主
     * <desc/>
     * @param       params      待查询的参数集
     * @return      符合的房间对象集
     * @author JuGuang.S
     * @createDate 2018/12/6
     */
    Integer getIsOwnerUser(Map<String, Object> params);

    /**
     * <desc>
     *      根据项目ID和pubKey查询单个项目
     * <desc/>
     * @param  desProjectId  待查询项目ID
     * @param  pubKey  项目密钥
     * @return  ProjectPO  返回对象
     * @author JuGuang.S
     * @createDate 2018/05/11
     */
    ProjectPO getByProjectIdAndPubKey(String desProjectId, String pubKey);

    /**
     * <desc>
     *      根据项目编号查询sip的ip和port
     * <desc/>
     * @param  projectId  查询项目ID
     * @return  Map<String,String>  返回sip的ip和port
     * @author JuGuang.S
     * @createDate 2018/05/14
     */
    Map<String,Object> getSipInfoByProjectId(String projectId);

    /**
     * <desc>
     *      获取项目的楼栋信息列表
     * </desc>
     *
     * @param cloudTalkSDKServerGetBuildListDTO 查询参数
     * @return 楼栋信息列表
     * @author wangzhi
     * @createDate 2018/05/23
     */
    CloudTalkSDKServerGetBuildVO getBuildList(CloudTalkSDKServerGetBuildListDTO cloudTalkSDKServerGetBuildListDTO) throws Exception;

    /**
     * <desc>
     *     获取项目楼栋的单元信息列表
     * </desc>
     *
     * @param cloudTalkSDKServerGetUnitListDTO 查询参数
     * @return 项目楼栋的单元信息列表
     * @author wangzhi
     * @createDate 2018/05/23
     */
    CloudTalkSDKServerGetUnitVO getUnitList(CloudTalkSDKServerGetUnitListDTO cloudTalkSDKServerGetUnitListDTO) throws Exception;

    /**
     * <desc>
     *      根据appId查询项目列表
     * <desc/>
     * @param       pageDTO      用户名称
     * @return      项目集
     * @author Qiang.S
     * @createDate 2018/05/23
     */
    Page<SDKServerProjectInfoListPageVO> getProjectList(CloudTalkSDKServerGetProjectInfoPageDTO pageDTO) throws Exception;

    /**
     * <desc>
     *      上传苹果推送证书
     * </desc>
     *
     * @return 受影响的行数
     * @author wangzhi
     * @createDate 2018/11/22
     */
    Integer uploadApplePush(CloudTalkSDKServerUploadApplePushDTO cloudTalkSDKServerUploadApplePushDTO) throws Exception;

    /**
     * <desc>
     *      根据项目编号和角色为开发者账号查询当前项目绑定的灵云快智的应用账号信息
     * <desc/>
     * @param  projectId  查询项目ID
     * @param  roleId  开发者账号
     * @return
     * @author JuGuang.S
     * @createDate 2018/12/21
     */
    String getBingLykzAppId(String projectId,String roleId,String appId);
}
